home *** CD-ROM | disk | FTP | other *** search
- ;* VGATEXT.ASM
- ;*
- ;* VGA text output routines for MIDAS Sound System
- ;*
- ;* $Id: vgatext.asm,v 1.3 1997/01/16 18:41:59 pekangas Exp $
- ;*
- ;* Copyright 1996,1997 Housemarque Inc.
- ;*
- ;* This file is part of the MIDAS Sound System, and may only be
- ;* used, modified and distributed under the terms of the MIDAS
- ;* Sound System license, LICENSE.TXT. By continuing to use,
- ;* modify or distribute this file you indicate that you have
- ;* read the license and understand and accept it fully.
- ;*
-
-
- IDEAL
- P386
-
- INCLUDE "lang.inc"
- INCLUDE "vgatext.inc"
-
-
- DATASEG
-
-
- IFDEF __PASCAL__
- IFDEF __PROTMODE__
- EXTRN SegB800 : word
- ENDIF
- ENDIF
-
- D_int scrWidth ; Screen width in _bytes_ (!!)
-
-
-
- IDATASEG
-
-
- hextable DB "0123456789ABCDEF"
-
-
- CODESEG
-
-
- ;/***************************************************************************\
- ;*
- ;* Macro: STARTADDR
- ;*
- ;* Description: Calculates the start address in display memory
- ;*
- ;* Input: segreg segment register for address
- ;* indexreg index register for address
- ;* xc starting x coordinate
- ;* yc starting y coordinate
- ;*
- ;* Returns: points segreg:indexreg to correct display memory byte
- ;*
- ;* Destroys: _ax
- ;*
- ;\***************************************************************************/
-
- MACRO STARTADDR segreg, indexreg, xc, yc
-
- mov _ax,yc
- dec _ax
- mul [scrWidth]
- mov indexreg,xc ; point indexter to dest in display
- dec indexreg ; memory (160*y + 2*x)
- shl indexreg,1
- add indexreg,_ax
-
- IFDEF __REALMODE__
- mov ax,0B800h ; point segreg to display memory
- mov segreg,ax
- ELSE
- IFDEF __16__
- mov segreg,[SegB800]
- ELSE
- add indexreg,0B8000h
- ENDIF
- ENDIF
-
- ENDM
-
-
-
-
-
- ;/***************************************************************************\
- ;*
- ;* Function: void vgaSetWidth(int width);
- ;*
- ;* Description: Sets the screen width used by text output routines
- ;*
- ;* Input: int width screen width in characters
- ;*
- ;\***************************************************************************/
-
- PROC vgaSetWidth _funct width : _int
-
- mov _ax,[width]
- shl _ax,1
- mov [scrWidth],_ax
-
- ret
- ENDP
-
-
-
-
- ;/***************************************************************************\
- ;*
- ;* Function: void vgaWriteText(int x, int y, char *txt);
- ;*
- ;* Description: Writes text on the screen
- ;*
- ;* Input: int x X coordinate of string (up-left
- ;* corner is (1,1))
- ;* int y Y coordinate
- ;* char *txt pointer to null-terminated text
- ;* string, which may contain also the
- ;* following special characters:
- ;* \xFF - next char is attribute
- ;* \x7F - next char is RLE count for
- ;* the character following it
- ;*
- ;\***************************************************************************/
-
- PROC vgaWriteText _funct x : _int, y : _int, txt : _ptr
- USES _si,_di,_bx
-
- STARTADDR es, _di, [x], [y]
-
- PUSHSEGREG ds
-
- LOADPTR ds,_si,[txt] ; point ds:si to string
-
- mov ah,07h ; default attribute is 07h - white
- ; on black
-
- @@lp: mov al,[_si] ; get byte from string
- inc _si
- test al,al ; zero? (string termination)
- jz @@done
-
- cmp al,0FFh ; is next byte attribute?
- je @@attr
-
- cmp al,07Fh ; is next byte RLE count?
- je @@rle
-
- mov [_esdi],ax ; normal character - write to screen
- add _di,2
- jmp @@lp ; and get next character
-
- @@attr:
- mov ah,[_si] ; get next attribute
- inc _si
- jmp @@lp ; get next character
-
- @@rle:
- xor _cx,_cx
- mov cl,[_si] ; get RLE count
- mov al,[_si+1] ; get RLE byte
- add _si,2
- rep stosw ; draw characters
- jmp @@lp ; get next character
-
- @@done:
- POPSEGREG ds
-
- ret
- ENDP
-
-
-
-
- ;/***************************************************************************\
- ;*
- ;* Function: void vgaWriteStr(int x, int y, char *str, char attr,
- ;* int txtlen);
- ;*
- ;* Description: Writes a string on the screen
- ;*
- ;* Input: int x X coordinate of the string
- ;* int y Y coordinate
- ;* char *str pointer to a ASCIIZ string
- ;* char attr attribute for the string
- ;* int txtlen number of characters to be printed on
- ;* screen - padded with spaces
- ;*
- ;\***************************************************************************/
-
- PROC vgaWriteStr _funct x : _int, y : _int, str : _ptr, attr : _int,\
- maxlen : _int
- USES _si,_di,_bx
-
- STARTADDR es, _di, [x], [y]
-
- PUSHSEGREG ds
-
- LOADPTR ds,_si,[str] ; point ds:si to string
-
- mov ah,[byte attr] ; attribute
- mov _cx,[maxlen] ; maximum number of characters
- test _cx,_cx
- jz @@done
-
- @@lp: lodsb ; get character
- test al,al ; zero? (end of string)
- jz @@send ; if is, stop
- stosw ; write character and attribute
- loop @@lp ; and get next character
- jmp @@done
-
- @@send:
- mov al,' ' ; string end - pad with spaces
- rep stosw
-
- @@done:
- POPSEGREG ds
-
- ret
- ENDP
-
-
-
-
- ;/***************************************************************************\
- ;*
- ;* Function: void vgaWriteByte(int x, int y, uchar byte, char attr);
- ;*
- ;* Description: Writes a hex byte on the screen
- ;*
- ;* Input: int x X coordinate
- ;* int y Y coordinate
- ;* uchar byte byte to be written
- ;* char attr attribute for the byte
- ;*
- ;\***************************************************************************/
-
- PROC vgaWriteByte _funct x : _int, y : _int, b : _int, attr : _int
- USES _di,_bx
-
- STARTADDR es, _di, [x], [y]
-
- mov ah,[byte attr] ; attribute
- mov bl,[byte b]
- shr _bx,4 ; upper nybble
- and _bx,0Fh
- mov al,[hextable+_bx] ; upper nybble character
- mov [_esdi],ax ; write upper nybble
-
- mov bl,[byte b]
- and bx,0Fh ; lower nybble
- mov al,[hextable+_bx] ; lower nybble character
- mov [_esdi+2],ax ; write lower nybble
-
- ret
- ENDP
-
-
-
-
- ;/***************************************************************************\
- ;*
- ;* Function: void vgaFillRect(int x1, int y1, int x2, int y2, char attr);
- ;*
- ;* Description: Draws a filled rectangle on the screen
- ;*
- ;* Input: int x1 X-coordinate of upper left corner
- ;* int y1 Y-coordinate of upper left corner
- ;* int x2 X-coordinate of lower left corner
- ;* int y2 Y-coordinate of lower left corner
- ;* char attr rectangle attribute
- ;*
- ;\***************************************************************************/
-
- PROC vgaFillRect _funct x1 : _int, y1 : _int, x2 : _int, y2 : _int, \
- attr : _int
- USES _si,_di,_bx
-
- cld
-
- STARTADDR es, _di, [x1], [y1]
-
- mov _bx,[y2]
- sub _bx,[y1] ; _bx = row counter (y2-y1+1)
- inc _bx
-
- mov _dx,[x2]
- sub _dx,[x1] ; _dx = number of columns (x2-x1+1)
- inc _dx
-
- mov _ax,_dx
- shl _ax,1 ; _si = number of bytes to skip
- mov _si,160 ; at the end of each row
- sub _si,_ax ; (160 - 2*width)
-
- mov ah,[byte attr] ; ah = attribute
- mov al,' '
-
- @@rowlp:
- mov _cx,_dx
- rep stosw ; draw one row's space+attr pairs
- add _di,_si ; point di to beginning of next row
- dec _bx
- jnz @@rowlp ; do next row
-
- ret
- ENDP
-
-
-
-
- ;/***************************************************************************\
- ;*
- ;* Function: void vgaDrawChar(int x, int y, char ch, char attr);
- ;*
- ;* Description: Draws a single character on the screen
- ;*
- ;* Input: int x character X-coordinate
- ;* int y character Y-coordinate
- ;* char ch character
- ;* char attr character attribute
- ;*
- ;\***************************************************************************/
-
- PROC vgaDrawChar _funct x : _int, y : _int, cha : _int, attr : _int
- USES _bx
-
- STARTADDR es, _bx, [x], [y]
-
- mov ah,[byte attr] ; ah = attribute
- mov al,[byte cha] ; al = character
- mov [_esbx],ax ; draw character & attribute
-
- ret
- ENDP
-
-
-
-
- ;/***************************************************************************\
- ;*
- ;* Function: void vgaSetMode(int mode)
- ;*
- ;* Description: Sets a VGA BIOS display mode
- ;*
- ;* Input: int mode BIOS mode number
- ;*
- ;\***************************************************************************/
-
- PROC vgaSetMode _funct mode : _int
- USES _bx
-
- mov al,[byte mode]
- xor ah,ah ; int 10h, function 0 - set display
- int 10h ; mode
-
- ret
- ENDP
-
-
-
-
- ;/***************************************************************************\
- ;*
- ;* Function: void vgaMoveCursor(int x, int y);
- ;*
- ;* Description: Moves the text mode cursor to a new location
- ;*
- ;* Input: int x cursor X-coordinate
- ;* int y cursor Y-coordinate
- ;*
- ;\***************************************************************************/
-
- PROC vgaMoveCursor _funct x : _int, y : _int
- USES _bx
-
- mov ax,0200h ; int 10h, function 2 - set cursor
- ; location
- xor bx,bx ; bh = display page (0)
- mov dl,[byte x] ; dl = column (0-based)
- dec dl
- mov dh,[byte y] ; dh = row (0-based)
- dec dh
- int 10h
-
- ret
- ENDP
-
-
-
-
- ;/***************************************************************************\
- ;*
- ;* Function: void vgaDrawChars(int x, int y, char ch, char attr, int num);
- ;*
- ;* Description: Draws many charactersr on the screen
- ;*
- ;* Input: int x character X-coordinate
- ;* int y character Y-coordinate
- ;* char ch character
- ;* char attr character attribute
- ;* int num number characters to draw
- ;*
- ;\***************************************************************************/
-
- PROC vgaDrawChars _funct x : _int, y : _int, cha : _int, attr : _int, \
- num : _int
- USES _di
-
- STARTADDR es, _di, [x], [y]
-
- mov ah,[byte attr] ; ah = attribute
- mov al,[byte cha] ; al = character
- mov _cx,[num] ; number of characters to draw
- cld
- rep stosw ; draw characted-attribute pairs
-
- ret
- ENDP
-
-
-
- ;* $Log: vgatext.asm,v $
- ;* Revision 1.3 1997/01/16 18:41:59 pekangas
- ;* Changed copyright messages to Housemarque
- ;*
- ;* Revision 1.2 1996/08/04 11:34:55 pekangas
- ;* All functions now preserve _bx
- ;*
- ;* Revision 1.1 1996/05/22 20:49:33 pekangas
- ;* Initial revision
- ;*
-
- END